⛓️ devops | September 17, 2021
AWS 명령줄 인터페이스(CLI)는 AWS 서비스를 관리하는 통합 도구입니다.
여러 AWS 서비스를 명령줄에서 제어하고 스크립트를 통해 자동화할 수 있습니다.
$ sudo yum install python-pip
$ sudo pip install boto
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install
CLI를 다루기 위한 서버 설정
complete -C '/usr/local/bin/aws_completer' aws
: bash 쉘 자동완성 하기 위한 설정$ sudo vi ~/.bash_profile
# .bash_profile에 해당 명령어 넣기 >> complete -C '/usr/local/bin/aws_completer' aws
# PATH=$PATH:$HOME/bin
# export PATH
$ source ~/.bash_profile
# aws에 로그인하기 위한 명령어
$ aws configure
$ 엑세스 키, 시크릿 키 입력
$ Default region name [None]: 리전 네임입력
$ Default output format [None]: 데이터 포맷을 결정
VPC를 CIDR 값을 정해 만들기
--output
옵션 : 결과물을 테이블 형식으로 보기$ aws ec2 create-vpc --cidr-block 172.16.0.0/16 --output table
$ aws ec2 describe-vpcs --output table
서브넷 만들기
# 변수 선언
$ MY_VPC=vpc-035eb45dd473aa061
# 서브넷 생성
$ aws ec2 create-subnet --vpc-id $MY_VPC --cidr-block 172.16.0.0/20 --availability-zone ap-northeast-2a --output table
$ aws ec2 create-subnet --vpc-id $MY_VPC --cidr-block 172.16.32.0/20 --availability-zone ap-northeast-2c --output table
상세 정보 보기 (필터링 포함)
$ aws ec2 create-internet-gateway --output table
# 상세 정보 확인
$ aws ec2 describe-internet-gateways --output table
$ aws ec2 attach-internet-gateway --vpc-id $MY_VPC --internet-gateway-id $MY_IGW
$ aws ec2 describe-internet-gateways --output table
$ aws ec2 create-route-table --vpc-id $MY_VPC --output table
$ aws ec2 describe-route-tables --output table
라우팅 테이블에 인터넷 게이트웨이를 추가
# 변수 설정
$ MY_RTB=rtb-0ff265e3570259a34
$ aws ec2 create-route --route-table-id $MY_RTB --destination-cidr-block 0.0.0.0/0 \
--gateway-id $MY_IGW --output table
# 상세정보 확인
$ aws ec2 describe-route-tables --route-table-id $MY_RTB --output table
$ aws ec2 describe-subnets --filters "Name=vpc-id,Values=$MY_VPC" \
--query 'Subnets[*].{ID:SubnetId,CIDR:CidrBlock}'
# 변수 설정
$ MY_SID1=subnet-0775ed14f85759e14
$ MY_SID2=subnet-08c42a258a37d56e1
$ aws ec2 associate-route-table --subnet-id $MY_SID1 --route-table-id $MY_RTB
$ aws ec2 associate-route-table --subnet-id $MY_SID2 --route-table-id $MY_RTB
VPC-Subnet에 자동 할당 IP 수정을 해주는 것
$ aws ec2 modify-subnet-attribute --subnet-id $MY_SID1 --map-public-ip-on-launch
$ aws ec2 modify-subnet-attribute --subnet-id $MY_SID2 --map-public-ip-on-launch
VPC-DNS 호스트 이름 편집
$ aws ec2 modify-vpc-attribute --vpc-id $MY_VPC --enable-dns-hostnames
키페어 생성 후, 키를 해당 서버에 저장하기
--output
를 text 형식으로 만들어서 *.pem 파일을 생성$ aws ec2 create-key-pair --key-name MyKeyPair --query 'KeyMaterial' \
--output text > MyKeyPair.pem
$ chmod 400 MyKeyPair.pem
$ aws ec2 create-security-group --group-name HTTP_SSH_Access \
--description "Security group for HTTP_SSH access" --vpc-id $MY_VPC
$ aws ec2 describe-security-groups --output table
$ MY_IP=$(curl http://checkip.amazonaws.com/)
# 서버의 아이피 - 13.125.xxx.133
$ curl http://checkip.amazonaws.com/
보안 그룹 인바운드 설정
ingress
, 아웃바운드는 egress
명령어$ MY_SG=sg-05b321deb1c4e237d
# SSH 포트와 HTTP 포트를 설정
$ aws ec2 authorize-security-group-ingress --group-id $MY_SG --protocol tcp \
--port 22 --cidr $MY_IP/32
$ aws ec2 authorize-security-group-ingress --group-id $MY_SG --protocol tcp \
--port 80 --cidr 0.0.0.0/0
$ vi mapping.json
[
{
"DeviceName": "/dev/xvda",
"Ebs": {
"VolumeSize": 8
}
},
{
"DeviceName": "/dev/sdh",
"Ebs": {
"VolumeSize": 8
}
}
]
$ aws ec2 describe-images \
--owners amazon \
--filters 'Name=name,Values=amzn2-ami-hvm-2.0.????????.?-x86_64-gp2' 'Name=state,Values=available' \
--query 'reverse(sort_by(Images, &CreationDate))[:1].ImageId' \
--output text
EC2 생성하기
--image-id
옵션의 값은 자주 바뀌니 주의$ aws ec2 run-instances --image-id ami-08c64544f5cfcddd0 \
--count 1 --instance-type t2.micro --key-name MyKeyPair \
--security-group-ids $MY_SG \
--subnet-id $MY_SID1 \
--block-device-mappings file://mapping.json
EC2 상세 정보 조회
$ MY_IID=i-0c463c0c5951523b1
$ aws ec2 describe-instances --instance-id $MY_IID
$ ssh -i "MyKeyPair.pem" ec2-user@3.36.99.213
$ sudo yum install -y httpd
$ sudo systemctl enable --now httpd
$ curl 3.36.99.213
$ exit
$ aws ec2 terminate-instances --instance-id $MY_IID
$ aws ec2 describe-instances --instance-ids $MY_IID
$ aws ec2 delete-subnet --subnet-id $MY_SID1
$ aws ec2 delete-subnet --subnet-id $MY_SID2
$ aws ec2 delete-route-table --route-table-id $MY_RTB
$ aws ec2 detach-internet-gateway --internet-gateway-id $MY_IGW --vpc-id $MY_VPC
$ aws ec2 delete-internet-gateway --internet-gateway-id $MY_IGW
$ aws ec2 delete-vpc --vpc-id $MY_VPC
제목쓰기
EC2의 클라우드 환경에서는 인벤토리를 관리할 필요가 없습니다.
온프레미스처럼 기존에 가지고 있는 서버가 없기 때문입니다.
따라서 hosts는 localhost로 작업을 진행하면 됩니다.
앤서블 설치
$ sudo amazon-linux-extras install ansible2
$ aws ec2 describe-images \
--owners amazon \
--filters 'Name=name,Values=amzn2-ami-hvm-2.0.????????.?-x86_64-gp2' 'Name=state,Values=available' \
--query 'reverse(sort_by(Images, &CreationDate))[:1].ImageId' \
--output text
플레이북에 활용한 yaml 파일 만들기
hosts: localhost
옵션은 EC2 서버가 앤서블의 코어로 동작하는 것을 의미합니다.wait
옵션 : 수행 결과를 기다리는 것임$ vi ec2.yml
- name: launch webservers instance
hosts: localhost
tasks:
- name: start the instance
ec2:
region: ap-northeast-2
image: ami-08c64544f5cfcddd0
instance_type: t2.micro
exact_count: 1
count_tag: { type: web }
vpc_subnet_id: subnet-3ec34455
assign_public_ip: True
user_data: "{{ lookup('file', 'user_data.sh') }}"
instance_tags: { Name: WEB }
group: SG-WEB
key_name: 0916
wait: yes
$ vi user_data.sh
#!/bin/bash
yum install -y httpd
systemctl start httpd && sudo systemctl enable httpd
echo "WEB" > /var/www/html/index.html
$ ansible-playbook ec2.ym
fdsaf